/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package raccoon.suvisa.logica.servicios.manejador.entidades.bs.beans;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.logging.Logger;
import javax.ejb.EJB;
import raccoon.suvisa.logica.servicios.manejador.entidades.bs.*;
import javax.ejb.Stateless;
import raccoon.suvisa.datos.entities.Cuenta;
import raccoon.suvisa.datos.entities.Cuentaxentidad;
import raccoon.suvisa.datos.entities.Entidad;
import raccoon.suvisa.datos.entities.Tarjeta;
import raccoon.suvisa.datos.entities.TipoTarjeta;
import raccoon.suvisa.datos.entities.Transaccion;
import raccoon.suvisa.datos.fachadas.TarjetaRemote;
import raccoon.suvisa.datos.fachadas.TransaccionRemote;
import raccoon.suvisa.logica.servicios.localizadorServicios.LocalizadorDatosLocal;
import raccoon.suvisa.logica.serviciosweb.consumidos.WSgenericoRemote;

/**
 *
 * @author Gabriel
 */
@Stateless
public class ServicioPublicoBean implements ServicioPublicoRemote {

    @EJB
    private LocalizadorDatosLocal data;
    @EJB
    private WSgenericoRemote ws;
    @EJB
    private TransaccionRemote tremote;

    //Registrar Servicio Publico
    public BigDecimal registrarServicioPublicoRemote(BigInteger nit, String nombre_entidad,
            char activo, char cajero, String sucursal, char entidadComercial,
            char entidadSerPublicos, char banco, char cajaCompensacion,
            char financiamiento, char tipoCuenta) {

        BigDecimal idEntidad = new BigDecimal("0");
        BigDecimal idCuenta = new BigDecimal("0");

        try {
            Logger log = Logger.getLogger(EntidadComercialBean.class.getName());
            log.info("Entre a Servicio Publico");

            //Crea Entidad
            Entidad entidad = new Entidad();
            entidad.setActivo(activo);
            entidad.setCajero(cajero);
            entidad.setNit(nit);
            entidad.setNombreEntidad(nombre_entidad);
            entidad.setSucursal(sucursal);
            entidad.setEntidadcomercial(entidadComercial);
            entidad.setEntidadservpublicos(entidadSerPublicos);
            entidad.setBanco(banco);
            entidad.setCajacompensasion(cajaCompensacion);
            entidad.setFinanciamientocomercial(financiamiento);
            //Crea Cuenta
            Cuenta cuenta = new Cuenta();
            cuenta.setActiva('F');
            Date hoy = new Date();
            cuenta.setFechaApertura(hoy);
            cuenta.setTipocuenta(tipoCuenta);
            idCuenta = data.getFachadaDatos().getMetodosCuenta().guardarNuevaCuenta(cuenta);
            idEntidad = data.getFachadaDatos().getMetodosEntidad().guardarNuevaEntidad(entidad);
            data.getFachadaDatos().getMetodosCuentaXEntidad().guardarNuevaCuentaXentidad(idCuenta,idEntidad.toBigInteger());
        } catch (Exception e) {
            Logger.getLogger(ServicioPublicoBean.class.getName()).info("Error al registrar Servicio Publico");
        }
        return idEntidad;
    }

    //Deshacer Transaccion
    public boolean deshacerTransaccion(BigDecimal id_transaccion) {
        try {
            Logger log = Logger.getLogger(EntidadComercialBean.class.getName());
            log.info("Entre a deshacer Transaccion");
            return data.getFachadaDatos().getMetodosTransaccion().deshacerTransaccion(id_transaccion);
        } catch (Exception e) {
            Logger.getLogger(ServicioPublicoBean.class.getName()).info("Error al deshacer Transaccion");
            return false;
        }
    }

    public BigDecimal registrarPago(BigDecimal idTarjeta, Double monto, BigInteger cuotas, BigInteger cuentaDe) {
        try {
            TarjetaRemote tr = data.getFachadaDatos().getMetodosTarjeta();
            Transaccion tccion = new Transaccion();
            if (tr != null) {
                Tarjeta t = tr.getTarjeta(idTarjeta);
                if (t.getActiva() == 'V') {
                    TipoTarjeta tt = data.getFachadaDatos().getMetodosTipoTarjeta().getTipoTarjeta(new BigDecimal(t.getIdTipoTarjeta()));
                    Double cupoMax = tt.getCupomax();
                    if (t.getSaldo() < cupoMax + monto) {
                        t.setSaldo(t.getSaldo() + monto + ((monto * 0.02) * new Double(cuotas.toString())));
                        tccion.setCancelada('F');
                        tccion.setCuotas(cuotas);
                        Date d = new Date();
                        String fecha;
                        fecha = d.getDay() + "/" + d.getMonth() + "/" + d.getYear();
                        tccion.setFecha(new Date(fecha));
                        tccion.setFechacancelada(new Date(fecha));
                        String cuenta = data.getFachadaDatos().getMetodosCuenta().getCuenta(new BigDecimal(t.getIdCuenta().toString())).getNumeroCuenta().toString();
                        tccion.setIdCuentao(new BigInteger(cuenta));
                        tccion.setIdCuentad(cuentaDe);
                        tccion.setIdTransaccion(BigDecimal.ZERO);
                        tccion.setMonto(monto);
                        BigDecimal ret = tremote.guardarNuevaTransaccion(tccion);
                        if (ret != BigDecimal.ZERO) {
                            String idCliente = data.getFachadaDatos().getMetodostarjetaHabientexTarjetaRemote().gettarjetaHabientexTarjeta(idTarjeta).getNumeroidentificacionth().toString();
                            String idTransaccion = ret.toString();
                            int tipo = 1;
                            if (ws.serviciosPublicos(cuenta, fecha, idCliente, idTarjeta.toString(), idTransaccion, monto.toString())) {
                                return ret;
                            } else {
                                tremote.deshacerTransaccion(tccion.getIdTransaccion());
                            }
                        }
                    }
                }
            }
            return BigDecimal.ZERO;
        } catch (Exception e) {
            Logger.getLogger(ServicioPublicoBean.class.getName()).info("Error al registrarPago");
            return BigDecimal.ZERO;
        }
    }
}
